
export {};
// 1.封装Event类， 实现事件绑定， 触发， 解

interface O {
  [propsName: string]: Function[]

}
class Event {
  private o: O = {}
  // 事件绑定
  on(type: string, callback: Function) {
    // 判断事件是否存在
    if(this.o[type]) {
      // 存在
      this.o[type].push(callback)
    } else {
      // 不存在
      this.o[type] = [callback]
    }
  }
  // 触发
  emit(type: string) {
    // 判断事件是否存在
    if(this.o[type]) {
      // 存在
      // 获取每一个事件， 然后执行
      this.o[type].map(callback  => {
        callback()
      })
    } else {
      // 不存在
      console.warn(`自定义事件${type}不存在， 请先绑定${type}事件， 再进行触发`)
      // throw new Error(`自定义事件${type}不存在， 请先绑定${type}事件， 再进行触发`)
    }

    
  }
  // 解除
  off(type: string) {
    delete this.o[type]
  }
}

const ev = new Event();

ev.on('qwer', () => {
  console.log('qwer事件触发了')
})

ev.on('qwer', () => {
  console.log('1111')
})

ev.on('iuytr', () => {
  console.log('iuytr 事件执行了')
})


ev.on('click', () => {
  console.log('2222222')
})

ev.emit('qwer')
ev.off('qwer')
ev.emit('qwer')


// 2.封装Storage 类， 提供本地存储和会话存储的操作。

class Storage {
  storage = localStorage

  setItem(key: string, value: any) {
    if(typeof value === 'string') {
      this.storage.setItem(key, value)
    } else if (typeof value === 'bigint' || typeof value === 'boolean' || typeof value === 'number') {
      this.storage.setItem(key, value.toString())
    } else {
      this.storage.setItem(key, JSON.stringify(value))
    }
  }
  getItem(key: string) {
    try {
      return JSON.parse(this.storage.getItem(key) as string)
    } catch {
      return this.storage.getItem(key)
    }
  }
}

const l = new Storage();

l.setItem('qwer', 12345)
l.setItem('arr', [1,2,3,4])
l.setItem('obj', { name: '张三 ' })
l.setItem('bool', false)
l.setItem('s', 'q')

console.log(l.getItem('qwer'))
console.log(l.getItem('arr'))
console.log(l.getItem('obj'))
console.log(l.getItem('bool'))
console.log(l.getItem('s'))


// 3.正确使用类的操作， 合理使用修饰符